#include<bits/stdc++.h>
using namespace std;
int MI[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072};
int cg[20],d[20][200005],q,c[100005],t[100005];
int A[100005],a[100005],b[20],ok[20];
pair<int,int> dfs(int l,int r,int R)
{
    if(R==0)
        return make_pair(l,0);
    if(R==1)
    {
        cg[1]++;
        if(d[R][cg[R]]==0)
        {
            if(l<=q)
            {
                if(a[l]>=1)
                    return make_pair(l,0);
                else if(r<=q)
                    return make_pair(r,0);
                else
                    return make_pair(0,r);
            }
            else
                return make_pair(0,l+r);
        }
        else{
            if(r<=q)
            {
                if(a[r]>=1)
                    return make_pair(r,0);
                else
                    return make_pair(l,0);
            }
            else if(l<=q)
                return make_pair(l,r);
            else
                return make_pair(0,l+r);
        }
    }
    pair<int,int> r1=dfs(l,(l+r)>>1,R-1);
    pair<int,int> r2=dfs(((l+r)>>1)+1,r,R-1);
    cg[R]++;
    if(d[R][cg[R]]==0){
        if(r1.first<=q)
        {
            if(a[r1.first]>=R)
                return make_pair(r1.first,r1.second+r2.second);
            else
                return make_pair(r2.first,r1.second+r2.second);
        }
        else{
            return make_pair(r2.first,r1.second+r2.second);
        }
    }
    else{
        if(r2.first<=q)
        {
            if(a[r2.first]>=R)
                return make_pair(r2.first,r1.second+r2.second);
            else
                return make_pair(r1.first,r1.second+r2.second);
        }
        else{
            return make_pair(r1.first,r1.second+r2.second);
        }
    }
}

int work(int l,int r,int R)
{
    if(R==0)
        return l;
    if(R==1)
    {
        cg[R]++;
        if(d[R][cg[R]]==0)
            return (b[l]>=1?l:r);
        else
            return (b[r]>=1?r:l);
    }
    int mid=(l+r)>>1;
    int r1=work(l,mid,R-1);
    int r2=work(mid+1,r,R-1);
    cg[R]++;
    if(d[R][cg[R]]==0)
        return (b[r1]>=R?r1:r2);
    else
        return (b[r2]>=R?r2:r1);
}
void fil(int p,int tr)
{
    if(p==MI[tr]+1)
    {
        memset(cg,0,sizeof(cg));
        int w=work(1,p-1,tr);
        ok[w]|=1;
        return;
    }
    if(p<=q)
    {
        fil(p+1,tr);
        return;
    }
    for(int i=0;i<=4;i++)
    {
        b[p]=i;
        fil(p+1,tr);
    }
}
int main()
{
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>A[i];
    for(int i=1;i<=m;i++)
        cin>>c[i],t[i]=lower_bound(MI,MI+17,c[i])-MI;
    int K=lower_bound(MI,MI+17,n)-MI;
    for(int i=1;i<=K;i++)
    {
        string s;
        cin>>s;
        for(int j=1;j<=MI[K-i];j++)
            d[i][j]=s[j-1]-48;
    }
    int T;
    cin>>T;
    for(int i=1;i<=T;i++)
    {
        int x[5],ans=0;
        for(int j=0;j<4;j++)
            cin>>x[j];
        for(int j=1;j<=n;j++)
            a[j]=A[j]^(x[j%4]);
        for(int j=1;j<=m;j++)
        {
            q=c[j];

            if(n>8)
            {
                pair<int,int> res=dfs(1,MI[t[j]],t[j]);
                ans=ans^(j*(res.first+res.second));
            }
            else
            {
                memset(b,255,sizeof(b));
                memset(ok,0,sizeof(ok));
                for(int i=1;i<=q;i++)
                    b[i]=a[i];
                fil(1,t[j]);
                int res=0;
                for(int k=1;k<=MI[t[j]];k++)
                    res+=ok[k]*k;
                ans=ans^(j*res);
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}
